/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Proyecto;

import java.util.ArrayList;

/**
 *
 * @author Garcia Cadavid
 */
public class BusquedaAEstrella {
    
    MonticuloBinario arreglo=new MonticuloBinario();
    String estado[][];
    int nElementos=0;
    int nodosCreados,nodosExpandidos;
    long tiempoInicio,duracion;

    public BusquedaAEstrella(String[][] estado) {
        this.estado = estado;
        tiempoInicio=System.currentTimeMillis();        
        nElementos++;        
    }

    public int RetornarNodosCreados()
    {
      return nodosCreados;
    }

    public int RetornarNodosExpandidos()
    {
      return nodosExpandidos;
    }

     
    public Nodo AlgoritmoBusquedaAEstrella()
    {
        nodosCreados=0;
        nodosExpandidos=0;
        nodosCreados++;
        Nodo actual=new Nodo(estado,0,null,null,0); 
        if(actual.Viabilidad())
        {
               while(!actual.EsMeta())
                {
                    //ArrayList hijos=actual.expandir();
                    ArrayList hijos=actual.expandirOrdenExpansion();
                    nodosExpandidos++;
                    nodosCreados+=hijos.size();
                    for (int i = 0; i < hijos.size(); i++) {
                        Nodo hijo=(Nodo) hijos.get(i);
                        arreglo.Ingresar(new Object[]{hijo.calcularHeuristica()+hijo.costoActual,hijo});
                    }
                    actual= (Nodo)(arreglo.ExtraerMin())[1];


        //            System.out.println();
        //            actual.ImprimirEstado();
        //            System.out.println();
        //            actual.ImprimirPosiciones();
                }
            duracion=System.currentTimeMillis()-tiempoInicio;
            System.out.println("Duracion :"+duracion);
            System.out.println("Meta hallada =D");
            return actual;
        }
        else return null;
        
    }
    
}
